package handler

import (
	pb "bianwang/Oss/proto"
	"bianwang/web/utils"
	"context"
	"fmt"
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
	_ "github.com/beego/beego/v2/client/cache/redis"
	"go.uber.org/zap"
	"os"
	"strings"
)

type Oss struct {
}

func (e *Oss) PingPong(ctx context.Context, stream pb.Oss_PingPongStream) error {
	//TODO implement me
	panic("implement me")
}

// 根据url地址上传文件
func (e *Oss) UpdataByUrl(ctx context.Context, req *pb.RequestUrl, rsp *pb.Response) error {
	zap.S().Info("根据url上传文件", req)
	utils.AlyLog("---------------- Oss    api/v1.0/UpdataByUrl ----------------", "")
	// 初始化返回值
	rsp.Code = utils.RECODE_OK
	rsp.Msg = utils.RecodeText(rsp.Code)

	client, err := oss.New(utils.GlobalConf.OssConfig.Endpoint, utils.GlobalConf.OssConfig.Accesskeyid, utils.GlobalConf.OssConfig.Accesskeysecret)
	if err != nil {
		rsp.Code = utils.RECODE_OSS_CLIENT_ERR
		rsp.Msg = err.Error()
		return nil
	}

	// 开启Bucket的传输加速状态。
	// Enabled表示传输加速的开关，取值为true表示开启传输加速，取值为false表示关闭传输加速。
	accConfig := oss.TransferAccConfiguration{}
	accConfig.Enabled = true
	err = client.SetBucketTransferAcc(utils.GlobalConf.OssConfig.Examplebucket, accConfig)
	if err != nil {
		rsp.Code = utils.RECODE_OSS_CLIENT_ERR
		rsp.Msg = err.Error()
		return nil
	}

	// 填写存储空间名称，例如examplebucket。
	bucket, err := client.Bucket(utils.GlobalConf.OssConfig.Examplebucket)
	if err != nil {
		rsp.Code = utils.RECODE_OSS_CLIENT_ERR
		rsp.Msg = err.Error()
		return nil
	}
	//err = bucket.PutObject("exampledir/ledirexampleobject.txt", fd)
	err = bucket.PutObject(req.Key, strings.NewReader(req.Url))

	if err != nil {
		rsp.Code = utils.RECODE_OSS_ERROR
		rsp.Msg = err.Error()
		return nil
	}
	rsp.Data = &pb.Response_Key{Key: req.Key}
	return nil
}

// 根据二进制串上传文件
func (e *Oss) UpdataByBase(ctx context.Context, req *pb.RequestBase, rsp *pb.Response) error {
	utils.AlyLog("---------------- GetArea    api/v1.0/UpdataByBase ----------------", "")
	// 初始化返回值
	rsp.Code = utils.RECODE_OK
	rsp.Msg = utils.RecodeText(rsp.Code)

	client, err := oss.New(utils.GlobalConf.OssConfig.Endpoint, utils.GlobalConf.OssConfig.Accesskeyid, utils.GlobalConf.OssConfig.Accesskeysecret)
	if err != nil {
		rsp.Code = utils.RECODE_OSS_CLIENT_ERR
		rsp.Msg = err.Error()
		return nil
	}

	// 开启Bucket的传输加速状态。
	// Enabled表示传输加速的开关，取值为true表示开启传输加速，取值为false表示关闭传输加速。
	accConfig := oss.TransferAccConfiguration{}
	accConfig.Enabled = true
	err = client.SetBucketTransferAcc(utils.GlobalConf.OssConfig.Examplebucket, accConfig)
	if err != nil {
		rsp.Code = utils.RECODE_OSS_CLIENT_ERR
		rsp.Msg = err.Error()
		return nil
	}

	// 填写存储空间名称，例如examplebucket。
	bucket, err := client.Bucket(utils.GlobalConf.OssConfig.Examplebucket)
	if err != nil {
		rsp.Code = utils.RECODE_OSS_CLIENT_ERR
		rsp.Msg = err.Error()
		return nil
	}

	// 填写本地文件的完整路径，例如D:\\localpath\\examplefile.txt。
	fd, err := os.Open(string(req.Base))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	//err = bucket.PutObject("exampledir/ledirexampleobject.txt", fd)
	err = bucket.PutObject(req.Key, fd)

	if err != nil {
		rsp.Code = utils.RECODE_OSS_ERROR
		rsp.Msg = err.Error()
		return nil
	}
	rsp.Data = &pb.Response_Key{Key: req.Key}
	return nil
}
func (e *Oss) GetData(ctx context.Context, req *pb.Request, rsp *pb.Response) error {
	utils.AlyLog("---------------- GetArea    api/v1.0/GetData ----------------", "")
	// 初始化返回值
	rsp.Code = utils.RECODE_OK
	rsp.Msg = utils.RecodeText(rsp.Code)

	client, err := oss.New(utils.GlobalConf.OssConfig.Endpoint, utils.GlobalConf.OssConfig.Accesskeyid, utils.GlobalConf.OssConfig.Accesskeysecret)
	if err != nil {
		rsp.Code = utils.RECODE_OSS_CLIENT_ERR
		rsp.Msg = err.Error()
		return nil
	}

	// 开启Bucket的传输加速状态。
	// Enabled表示传输加速的开关，取值为true表示开启传输加速，取值为false表示关闭传输加速。
	accConfig := oss.TransferAccConfiguration{}
	accConfig.Enabled = true
	err = client.SetBucketTransferAcc(utils.GlobalConf.OssConfig.Examplebucket, accConfig)
	if err != nil {
		rsp.Code = utils.RECODE_OSS_CLIENT_ERR
		rsp.Msg = err.Error()
		return nil
	}

	// 填写存储空间名称，例如examplebucket。
	bucket, err := client.Bucket(utils.GlobalConf.OssConfig.Examplebucket)
	if err != nil {
		rsp.Code = utils.RECODE_OSS_CLIENT_ERR
		rsp.Msg = err.Error()
		return nil
	}

	//err = bucket.PutObject("exampledir/ledirexampleobject.txt", fd)
	signedURL, err := bucket.SignURL(req.Key, oss.HTTPGet, 600, oss.Process("image/format,png"))

	if err != nil {
		rsp.Code = utils.RECODE_OSS_ERROR
		rsp.Msg = err.Error()
		return nil
	}
	rsp.Data = &pb.Response_Key{Key: req.Key}
	rsp.Data = &pb.Response_Url{Url: signedURL}
	return nil
}

func (e *Oss) Stream(ctx context.Context, request *pb.StreamingRequest, stream pb.Oss_StreamStream) error {
	//TODO implement me
	panic("implement me")
}
